package com.atguigu.util

import java.sql.{Connection, PreparedStatement, ResultSet}

/**
 * description ：操作 mysql， 将实现定义回调
 * author      ：剧情再美终是戏 
 * mail        : 13286520398@163.com
 * date        ：Created in 2020/3/11 15:49
 * modified By ：
 * version:    : 1.0
 */
object SqlProxy {
  private var rs: ResultSet = _
  private var psmt: PreparedStatement = _

  /**
   * 执行 sql 修改语句
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 15:53
   * @param conn   sql 连接
   * @param sql    需要执行的 sql
   * @param params 执行 sql 的参数
   * @return int
   * @Version 1.0
   **/
  def executeUpdate(conn: Connection, sql: String, params: Array[Any]): Int = {
    var rtn = 0
    try {
      if (null != conn) {
        psmt = conn.prepareStatement(sql)
        if (params != null && params.length > 0) {
          for (i <- params.indices) {
            psmt.setObject(i + 1, params(i))
          }
        }
        rtn = psmt.executeUpdate()
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
    rtn
  }

  /**
   * 执行 sql 查询
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 15:54
   * @param conn          sql 连接
   * @param sql           需要执行的 sql
   * @param params        执行 sql 的参数
   * @param queryCallback 回调函数
   * @return void
   * @Version 1.0
   **/
  def executeQuery(conn: Connection, sql: String, params: Array[Any], queryCallback: QueryCallback) = {
    rs = null
    try {
      if (null != conn) {
        psmt = conn.prepareStatement(sql)
        if (params != null && params.length > 0) {
          for (i <- 0 until params.length) {
            psmt.setObject(i + 1, params(i))
          }
        }
        // 获取结果并执行回调函数
        rs = psmt.executeQuery()
        queryCallback.process(rs)
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }

  /**
   * 关闭资源的方法
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 15:56
   * @param conn 连接
   * @return void
   * @Version 1.0
   **/
  def shutdown(conn: Connection): Unit = DataSourceUtil.closeResource(rs, psmt, conn)

  /**
   * msyql 开启事务
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 18:35
   * @param conn
   * @return void
   * @Version 1.0
   **/
  def beginTransaction(conn: Connection): Unit = {
    try {
      if (null != conn) {
        conn.setAutoCommit(false)
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }

  /**
   * mysql 提交事务
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 18:36
   * @param conn
   * @return void
   * @Version 1.0
   **/
  def commitTransaction(conn: Connection): Unit = {
    try {
      if (null != conn && !conn.getAutoCommit) {
        conn.commit()
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }

  /**
   * mysql 回滚事务
   *
   * @Author 剧情再美终是戏
   * @Date 2020/3/11 18:36
   * @param conn
   * @return void
   * @Version 1.0
   **/
  def rollback(conn: Connection): Unit = {
    try {
      if (null != conn && !conn.getAutoCommit) {
        conn.rollback()
      }
    } catch {
      case e: Exception => e.printStackTrace()
    }
  }

}

// 操作完 mysql 之后的回调函数， process方法完成具体的业务处理
trait QueryCallback {
  def process(rs: ResultSet)
}
